package main

import (
	"math"
	"strconv"
	"strings"
	"unicode/utf8"
)

func main() {
	var a int = 456
	var b int = 123

	println(a + b)
	println(a - b)
	println(a * b)
	println(a / b)

	println(float64(a) / float64(b))
	// a = a + 1
	a++
	println(a)
	// b = b - 1
	b--
	println(b)

	//var c float64 = 1.23
	//println(a + c) 无法这样直接加，因为go没有自动类型转换

	println(math.Abs(-12.3))
	ExtraNum()
	String()
}

func ExtraNum() {
	println(math.MaxInt)
	println("float64 最小整数", math.SmallestNonzeroFloat64)
	println("float32 最小整数", math.SmallestNonzeroFloat32)
}

func String() {
	str1 := "hello, go"
	println(str1)
	println("he said \"hello world\"")
	println(`hello, go
	随意换行，无转义，真正意义上的raw string
	`)

	// 字符串只能和字符串拼接，别的类型要转换为字符串后拼接
	println("hello" + strconv.Itoa(123))

	// len获取的是对应的字节长度
	println(len("hello"))   // 5
	println(len("hello你好")) // 11

	// 获取字节长度要用对应的编码包
	println(utf8.RuneCountInString("hello你好")) // 7

	// 操作字符串的库 strings
	println(strings.CutPrefix("hello, world", "hello"))
}

func Bytes() {
	var a byte = 12
	println(a)

	var b byte = 'a'
	println(b)

	// 注意这样子转会触发复制
	var str = "hello"
	var bs []byte = []byte(str)
	println(bs)
	var str1 string = string(bs)
	println(str1)
}

func Bool() {
	var a bool = true
	var b bool = false
	println(a && b)
	println(a || b)
	println(!a)
	// 离散数学
	// !(a&&b) => !a || !b
	// !(a||b) => !a && !b
}
